// 读取环境变量
require('dotenv').config();
const { port = 3333 } = process.env;
// 导入 express 包
const express = require('express');
// 异步错误捕获补丁
require('express-async-errors');
// 生成 express 服务实例 Application extends Router
const app = express();
const fs = require('fs'); // 文件系统模块
const path = require('path'); // 路径模块
const systemPath = path.dirname(__dirname);
// 引入 WebSocket 包
const expressWs = require('express-ws');
// 创建 WebSocket 服务
expressWs(app);

// 使用 cors 中间件支持跨域资源共享
const cors = require('cors');
app.use(
	cors({
		origin: (origin, callback) => {
			callback(null, origin);
		},
		credentials: true
	})
);

// 使用中间件解析 body,body-parser已经被express集成，无需调用安装body-parser，可以直接采用express.json()和express.urlencoded()
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ limit: '10mb', extended: true }));

let fileDirList = []; // 存放资源文件夹列表
fs.readdirSync(systemPath + '/public').forEach((val) => {
	fileDirList.push(val);
});

// 设置响应头
app.all('*', (req, res, next) => {
	res.header('Access-Control-Allow-Headers', 'content-type,Authorization'); // 允许携带的请求头
	res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE'); // 允许请求的方法
	// 根据不同的资源类型，设置不同的响应头
	// 如果path.basename(path.dirname(req.path))在fileDirList中，说明是图片资源
	if (fileDirList.includes(path.basename(path.dirname(req.path)))) {
		res.header('Content-Type', 'image/png;image/jpeg;image/jpg');
	} else {
		res.header('Content-Type', 'application/json;charset=utf-8');
	}
	next();
});

// session 中间件 （不使用）
// const session = require('express-session')
// 信任反向代理
app.set('trust proxy', 1);
// app.use(
//   session({
//     key: 'SESSION_ID',
//     secret: 'xiao yin always young',
//     resave: true, //每次设置是否要保存
//     saveUninitialized: true, //是否存储没有初始化的session. 所谓初始化是指生成session.id以后有没有设置value修改过此session
//     rolling: true, // 在每次请求时强行设置cookie，这将重置cookie的过期时间（默认值为false）
//     cookie: {
//       secure: false,
//       httpOnly: false,
//       maxAge: 60 * 60 * 1000
//     }
//   })
// )

// 使用中间件静态文件服务
app.use(express.static('public'));
// 加载路由
// const customerRouter = require("./routers/customer");
// customerRouter.registerRouter(app);
fs.readdirSync(__dirname + '/routers').forEach((val) => {
	try {
		const module = require(`./routers/${val}`);
		if (module.Router) module.Router(app);
	} catch (e) {
		console.log(e);
	}
});

// 全局错误处理
app.use((err, req, res, next) => {
	// 打印错误
	console.log(err);
	// 响应客户端
	res.status(500).send({ success: false, message: err.message });
});
// 启动服务监听
app.listen(port, () => {
	console.log(`Web服务成功启动：http://localhost:${port}`);
});
